Ticket #96: bug96.diff

File bug96.diff, 8.3 KB (added by hub__, 2 years ago)

Proposed patch

  • common/lc_basewindow.h

    commit e7f16805d1bfde767956da9d98e82ee12cedaf73
    Author: Hubert Figuière <hub@figuiere.net>
    Date:   Wed Dec 4 20:33:08 2013 -0500
    
        Bug 96 - make sure the property fields can't overflow.
    
    diff --git a/common/lc_basewindow.h b/common/lc_basewindow.h
    index ec38842..b9dd0fa 100644
    a b  
    11#ifndef _LC_BASEWINDOW_H_
    22#define _LC_BASEWINDOW_H_
    33
     4#include <string>
     5
    46#include "lc_math.h"
    57#include "lc_array.h"
    68#include "project.h"
    struct lcPropertiesDialogOptions 
    99101{
    100102        const char* Title;
    101103
    102         char Author[101];
    103         char Description[101];
    104         char Comments[256];
     104        std::string Author;
     105        std::string Description;
     106        std::string Comments;
    105107
    106108        int BackgroundType;
    107109        lcVector3 SolidColor;
  • common/project.cpp

    diff --git a/common/project.cpp b/common/project.cpp
    index 6d70793..fb11847 100644
    a b void Project::DeleteContents(bool bUndo) 
    121121        Light* pLight;
    122122        Group* pGroup;
    123123
    124         memset(m_strAuthor, 0, sizeof(m_strAuthor));
    125         memset(m_strDescription, 0, sizeof(m_strDescription));
    126         memset(m_strComments, 0, sizeof(m_strComments));
     124        m_strAuthor = "";
     125        m_strDescription = "";
     126        m_strComments = "";
    127127
    128128        if (!bUndo)
    129129        {
    bool Project::FileLoad(lcFile* file, bool bUndo, bool bMerge) 
    437437                        if (sh > 100)
    438438                                file->Seek(sh, SEEK_CUR);
    439439                        else
    440                                 file->ReadBuffer(m_strAuthor, sh);
     440                        {
     441                                char author[101];
     442                                file->ReadBuffer(author, sh);
     443                                author[sh] = 0;
     444                                m_strAuthor = author;
     445                        }
    441446
    442447                        file->ReadBuffer(&ch, 1);
    443448                        if (ch == 0xFF) file->ReadU16(&sh, 1); else sh = ch;
    444449                        if (sh > 100)
    445450                                file->Seek(sh, SEEK_CUR);
    446451                        else
    447                                 file->ReadBuffer(m_strDescription, sh);
     452                        {
     453                                char desc[101];
     454                                file->ReadBuffer(desc, sh);
     455                                desc[sh] = 0;
     456                                m_strDescription = desc;
     457                        }
    448458
    449459                        file->ReadBuffer(&ch, 1);
    450460                        if (ch == 0xFF && fv < 1.3f) file->ReadU16(&sh, 1); else sh = ch;
    451461                        if (sh > 255)
    452462                                file->Seek(sh, SEEK_CUR);
    453463                        else
    454                                 file->ReadBuffer(m_strComments, sh);
     464                        {
     465                                char comments[256];
     466                                file->ReadBuffer(comments, sh);
     467                                comments[sh] = 0;
     468                                m_strComments = comments;
     469                        }
    455470                }
    456471        }
    457472        else
    void Project::FileSave(lcFile* file, bool bUndo) 
    770785        for (pPiece = m_pPieces; pPiece; pPiece = pPiece->m_pNext)
    771786                pPiece->FileSave(*file);
    772787
    773         ch = strlen(m_strAuthor);
     788        // the file format seems to be limited to 100,100,255 chars
     789        // respectively.
     790        if(m_strAuthor.size() > 100)
     791                m_strAuthor.resize(100);
     792        ch = m_strAuthor.size();
    774793        file->WriteBuffer(&ch, 1);
    775         file->WriteBuffer(m_strAuthor, ch);
    776         ch = strlen(m_strDescription);
     794        file->WriteBuffer(m_strAuthor.c_str(), ch);
     795        if(m_strDescription.size() > 100)
     796                m_strDescription.resize(100);
     797        ch = m_strDescription.size();
    777798        file->WriteBuffer(&ch, 1);
    778         file->WriteBuffer(m_strDescription, ch);
    779         ch = strlen(m_strComments);
     799        file->WriteBuffer(m_strDescription.c_str(), ch);
     800        if(m_strComments.size() > 255)
     801                m_strComments.resize(255);
     802        ch = m_strComments.size();
    780803        file->WriteBuffer(&ch, 1);
    781         file->WriteBuffer(m_strComments, ch);
     804        file->WriteBuffer(m_strComments.c_str(), ch);
    782805
    783806        Group* pGroup;
    784807        for (i = 0, pGroup = m_pGroups; pGroup; pGroup = pGroup->m_pNext)
    bool Project::DoSave(const char* FileName) 
    11551178
    11561179                sprintf(buf, "0 Model exported from LeoCAD\r\n"
    11571180                                        "0 Original name: %s\r\n", ptr);
    1158                 if (strlen(m_strAuthor) != 0)
     1181                if (!m_strAuthor.empty())
    11591182                {
    11601183                        strcat(buf, "0 Author: ");
    1161                         strcat(buf, m_strAuthor);
     1184                        strcat(buf, m_strAuthor.c_str());
    11621185                        strcat(buf, "\r\n");
    11631186                }
    11641187                strcat(buf, "\r\n");
    bool Project::OnNewDocument() 
    12681291        SetTitle("Untitled");
    12691292        DeleteContents(false);
    12701293        memset(m_strPathName, 0, sizeof(m_strPathName)); // no path name yet
    1271         strcpy(m_strAuthor, lcGetProfileString(LC_PROFILE_DEFAULT_AUTHOR_NAME));
     1294        m_strAuthor = lcGetProfileString(LC_PROFILE_DEFAULT_AUTHOR_NAME);
    12721295        SetModifiedFlag(false); // make clean
    12731296        LoadDefaults(true);
    12741297        CheckPoint("");
    void Project::HandleCommand(LC_COMMANDS id) 
    51495172                                OBJFile.WriteLine(Line);
    51505173                        }
    51515174
    5152                         if (strlen(m_strAuthor))
     5175                        if (!m_strAuthor.empty())
    51535176                        {
    5154                                 sprintf(Line, "# Author: %s\n", m_strAuthor);
     5177                                snprintf(Line, sizeof(Line), "# Author: %s\n", m_strAuthor.c_str());
    51555178                                OBJFile.WriteLine(Line);
    51565179                        }
    51575180
    void Project::HandleCommand(LC_COMMANDS id) 
    52265249
    52275250                        Options.Title = m_strTitle;
    52285251
    5229                         strcpy(Options.Author, m_strAuthor);
    5230                         strcpy(Options.Description, m_strDescription);
    5231                         strcpy(Options.Comments, m_strComments);
     5252                        Options.Author = m_strAuthor;
     5253                        Options.Description = m_strDescription;
     5254                        Options.Comments = m_strComments;
    52325255
    52335256                        if (m_nScene & LC_SCENE_BG)
    52345257                                Options.BackgroundType = 2;
    void Project::HandleCommand(LC_COMMANDS id) 
    52555278                                break;
    52565279
    52575280                        bool Modified = false;
    5258                        
    5259                         if (strcmp(m_strAuthor, Options.Author))
     5281
     5282                        if (m_strAuthor != Options.Author)
    52605283                        {
    5261                                 strcpy(m_strAuthor, Options.Author);
     5284                                m_strAuthor = Options.Author;
    52625285                                Modified = true;
    52635286                        }
    52645287
    5265                         if (strcmp(m_strDescription, Options.Description))
     5288                        if (m_strDescription != Options.Description)
    52665289                        {
    5267                                 strcpy(m_strDescription, Options.Description);
     5290                                m_strDescription = Options.Description;
    52685291                                Modified = true;
    52695292                        }
    52705293
    5271                         if (strcmp(m_strComments, Options.Comments))
     5294                        if (m_strComments != Options.Comments)
    52725295                        {
    5273                                 strcpy(m_strComments, Options.Comments);
     5296                                m_strComments = Options.Comments;
    52745297                                Modified = true;
    52755298                        }
    52765299
  • common/project.h

    diff --git a/common/project.h b/common/project.h
    index 4c428db..fdfad40 100644
    a b  
    11#ifndef _PROJECT_H_
    22#define _PROJECT_H_
    33
     4#include <string>
     5
    46#include "object.h"
    57#include "opengl.h"
    68#include "lc_array.h"
    protected: 
    301303        View* m_ActiveView;
    302304        lcArray<View*> m_ViewList;
    303305
    304         char m_strAuthor[101];
    305         char m_strDescription[101];
    306         char m_strComments[256];
     306        std::string m_strAuthor;
     307        std::string m_strDescription;
     308        std::string m_strComments;
    307309
    308310        // Piece library
    309311        TexFont* m_pScreenFont;
  • qt/lc_qpropertiesdialog.cpp

    diff --git a/qt/lc_qpropertiesdialog.cpp b/qt/lc_qpropertiesdialog.cpp
    index 33f1539..9857182 100644
    a b lcQPropertiesDialog::lcQPropertiesDialog(QWidget *parent, void *data) : 
    2525
    2626        setWindowTitle(QString(tr("%1 Properties")).arg(options->Title));
    2727
    28         ui->descriptionEdit->setText(QString::fromUtf8(options->Description));
    29         ui->authorEdit->setText(QString::fromUtf8(options->Author));
    30         ui->commentsEdit->setText(QString::fromUtf8(options->Comments));
     28        ui->descriptionEdit->setText(QString::fromUtf8(options->Description.c_str()));
     29        ui->authorEdit->setText(QString::fromUtf8(options->Author.c_str()));
     30        ui->commentsEdit->setText(QString::fromUtf8(options->Comments.c_str()));
    3131
    3232        if (options->BackgroundType == 2)
    3333                ui->imageRadio->setChecked(true);
    lcQPropertiesDialog::~lcQPropertiesDialog() 
    123123
    124124void lcQPropertiesDialog::accept()
    125125{
    126         strcpy(options->Description, ui->descriptionEdit->text().toUtf8().data());
    127         strcpy(options->Author, ui->authorEdit->text().toUtf8().data());
    128         strcpy(options->Comments, ui->commentsEdit->toPlainText().toUtf8().data());
     126        options->Description = ui->descriptionEdit->text().toUtf8().data();
     127        options->Author = ui->authorEdit->text().toUtf8().data();
     128        options->Comments = ui->commentsEdit->toPlainText().toUtf8().data();
    129129
    130130        if (ui->imageRadio->isChecked())
    131131                 options->BackgroundType = 2;
  • qt/lc_qpropertiesdialog.ui

    diff --git a/qt/lc_qpropertiesdialog.ui b/qt/lc_qpropertiesdialog.ui
    index 9bcb293..a1e99e8 100644
    a b  
    3232        </widget>
    3333       </item>
    3434       <item row="0" column="1">
    35         <widget class="QLineEdit" name="authorEdit"/>
     35        <widget class="QLineEdit" name="authorEdit">
     36         <property name="maxLength">
     37          <number>100</number>
     38         </property>
     39        </widget>
    3640       </item>
    3741       <item row="1" column="0">
    3842        <widget class="QLabel" name="label_3">
     
    4246        </widget>
    4347       </item>
    4448       <item row="1" column="1">
    45         <widget class="QLineEdit" name="descriptionEdit"/>
     49        <widget class="QLineEdit" name="descriptionEdit">
     50         <property name="maxLength">
     51          <number>100</number>
     52         </property>
     53        </widget>
    4654       </item>
    4755       <item row="2" column="0">
    4856        <widget class="QLabel" name="label_2">