* src/pic/device.c (find_device): prevent buffer underflow error
authortecodev <tecodev@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Thu, 27 Sep 2007 22:48:03 +0000 (22:48 +0000)
committertecodev <tecodev@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Thu, 27 Sep 2007 22:48:03 +0000 (22:48 +0000)
* src/pic/pcoderegs.c (OptimizeRegUsage): avoid dereferencing
  the just destroyed list entry

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4920 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/pic/device.c
src/pic/pcoderegs.c

index bc4483cf8d35922bc820043ce66ce6352cfe6df4..c0fb9e07ee4f1d32d3f55206a0d6580326b21163 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-28 Raphael Neider <rneider AT web.de>
+
+       * src/pic/device.c (find_device): prevent buffer underflow error
+       * src/pic/pcoderegs.c (OptimizeRegUsage): avoid dereferencing
+         the just destroyed list entry
+
 2007-09-18 Frieder Ferlemann <Frieder.Ferlemann AT web.de>
 
        * doc/sdccman.lyx: there's a dedicated wiki page for cmake and sdcc, thanks
index 36c0caf0e70a639aae4bf40fece02bf99661c3f4..528cde2767cc51e0f19956b8942a919cecf64504 100644 (file)
@@ -278,10 +278,14 @@ static PIC_device *find_device(char *pic_name)
        /* read line by line */
        pic_buf[sizeof(pic_buf)-1] = '\0';
        while (fgets(pic_buf, sizeof(pic_buf)-1, pic_file) != NULL && !done) {
+               unsigned llen;
+               llen = strlen (pic_buf);
                
                /* remove trailing spaces */
-               while (isspace(pic_buf[strlen(pic_buf)-1]))
-                       pic_buf[strlen(pic_buf)-1] = '\0';
+               while (llen && isspace(pic_buf[llen-1])) {
+                       pic_buf[llen-1] = '\0';
+                       llen--;
+               }
                
                /* remove leading spaces */
                for (pic_buf_pos = pic_buf; isspace(*pic_buf_pos); pic_buf_pos++)
index 8713a30d4003aabf51265e7cae330a07d254d058..3b29b904d9e7d24178eed5e67e8187b3a96e31e3 100644 (file)
@@ -848,7 +848,7 @@ void OptimizeRegUsage(set *fregs, int optimize_multi_uses, int optimize_level)
                                                        
                                                }
                                        }
-                                       rset1 = rset1->next;
+                                       rset1 = rset2;
                                }
                        }
                }