Hi,

I succeeded in building the entire SerialICE tool set (host and target) on mingw32. Most changes are in the repository already, but there are two issues in romcc without a clean fix so far, so I thought I'll post the patch for discussion to have it out in public.
As they're romcc related, I also added the coreboot list.

1. romcc seems to access memory after free. There's an xfree() call removed in that patch, which is a thinly disguised free() call. With that one removed, free_basic_block(..) works happily, with it present, I get a segfault. Win32 seems to invalidate free'd memory by writing a pattern (0xfeeefeee) there, and that trips up the next pointer deref.

There's probably a "sane" fix to that.

2. romcc uses open/read/close to read included files. For some reason, read always returns 0 bytes, so that's an endless loop. I kept the open/stat/close part, and replaced the read with fread (and fopen/fclose to support it).

This might be solved in a cleaner way.


Patrick
Index: util/romcc.c
===================================================================
--- util/romcc.c        (Revision 58)
+++ util/romcc.c        (Arbeitskopie)
@@ -224,6 +224,7 @@
        off_t size, progress;
        ssize_t result;
        struct stat stats;
+       FILE* file;
        
        if (!filename) {
                *r_size = 0;
@@ -234,6 +235,7 @@
        }
        xchdir(dirname);
        fd = open(filename, O_RDONLY);
+       file = fopen(filename, "rb");
        xchdir(cwd);
        if (fd < 0) {
                die("Cannot open '%s' : %s\n",
@@ -250,8 +252,13 @@
        buf[size] = '\n'; /* Make certain the file is newline terminated */
        buf[size+1] = '\0'; /* Null terminate the file for good measure */
        progress = 0;
+       result = close(fd);
+       if (result < 0) {
+               die("Close of %s failed: %s\n",
+                       filename, strerror(errno));
+       }
        while(progress < size) {
-               result = read(fd, buf + progress, size - progress);
+               result = fread(buf + progress, 1, size - progress, file);
                if (result < 0) {
                        if ((errno == EINTR) || (errno == EAGAIN))
                                continue;
@@ -260,11 +267,7 @@
                }
                progress += result;
        }
-       result = close(fd);
-       if (result < 0) {
-               die("Close of %s failed: %s\n",
-                       filename, strerror(errno));
-       }
+       fclose(file);
        return buf;
 }
 
@@ -15148,7 +15151,6 @@
                }
        }
        memset(block, -1, sizeof(*block));
-       xfree(block);
 }
 
 static void free_basic_blocks(struct compile_state *state, 
-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to