chiark / gitweb /
firmware: fix possible segfault when firmware device goes away while loading
authorKay Sievers <kay.sievers@vrfy.org>
Tue, 16 Mar 2010 09:57:44 +0000 (10:57 +0100)
committerKay Sievers <kay.sievers@vrfy.org>
Tue, 16 Mar 2010 09:57:44 +0000 (10:57 +0100)
Thanks to Ruediger Oertel.

extras/firmware/firmware.c

index 16455dec8f3299ef2283ce1382ad1cb1d99a0cb4..92f0918c6fce60818807321581ead92bdce01357 100644 (file)
@@ -63,8 +63,10 @@ static bool copy_firmware(struct udev *udev, const char *source, const char *tar
        if (fwrite(buf, size, 1, ftarget) == 1)
                ret = true;
 exit:
        if (fwrite(buf, size, 1, ftarget) == 1)
                ret = true;
 exit:
-       fclose(ftarget);
-       fclose(fsource);
+       if (ftarget != NULL)
+               fclose(ftarget);
+       if (fsource != NULL)
+               fclose(fsource);
        free(buf);
        return ret;
 }
        free(buf);
        return ret;
 }
@@ -178,7 +180,8 @@ int main(int argc, char **argv)
        if (unlink(misspath) == 0)
                util_delete_path(udev, misspath);
 
        if (unlink(misspath) == 0)
                util_delete_path(udev, misspath);
 
-       set_loading(udev, loadpath, "1");
+       if (!set_loading(udev, loadpath, "1"))
+               goto exit;
 
        util_strscpyl(datapath, sizeof(datapath), udev_get_sys_path(udev), devpath, "/data", NULL);
        if (!copy_firmware(udev, fwpath, datapath, statbuf.st_size)) {
 
        util_strscpyl(datapath, sizeof(datapath), udev_get_sys_path(udev), devpath, "/data", NULL);
        if (!copy_firmware(udev, fwpath, datapath, statbuf.st_size)) {