]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/osdep/unix/platform.c (get_ofpathname): Trim ending newline.
authorVladimir Serbinenko <phcoder@gmail.com>
Mon, 25 Nov 2013 06:34:49 +0000 (07:34 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Mon, 25 Nov 2013 06:34:49 +0000 (07:34 +0100)
Don't rely on PATH_MAX.

ChangeLog
grub-core/osdep/unix/platform.c

index 6b094216a0129300eb58247b81e7b13e597bebfb..75439bbb896d6c7e31000dc761e738205d96c960 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-11-25  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/osdep/unix/platform.c (get_ofpathname): Trim ending newline.
+       Don't rely on PATH_MAX.
+
 2013-11-25  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/genmoddep.awk: Use more portable && rather than and.
index 65c93f150bd2502310ac6f64c8f23a36f51545d6..dc296c98b75af23181c41c0bc637317c64bcb0f3 100644 (file)
 static char *
 get_ofpathname (const char *dev)
 {
-  char *ret = xmalloc (2 * PATH_MAX);
-  char *end = ret + 2 * PATH_MAX - 1;
+  size_t alloced = 4096;
+  char *ret = xmalloc (alloced);
+  size_t offset = 0;
   int fd;
   pid_t pid;
-  char *ptr = ret;
 
   pid = grub_util_exec_pipe ((const char * []){ "ofpathname", dev, NULL }, &fd);
   if (!pid)
@@ -45,13 +45,29 @@ get_ofpathname (const char *dev)
   if (!fp)
     goto fail;
 
-  while (!feof (fp) && ptr < end)
+  while (!feof (fp))
     {
       size_t r;
-      r = fread (ptr, 1, end - ptr, fp);
-      ptr += r;
+      if (alloced == offset)
+       {
+         alloced *= 2;
+         ret = xrealloc (ret, alloced);
+       }
+      r = fread (ret + offset, 1, alloced - offset, fp);
+      offset += r;
     }
 
+  if (offset > 0 && ret[offset - 1] == '\n')
+    offset--;
+  if (offset > 0 && ret[offset - 1] == '\r')
+    offset--;
+  if (alloced == offset)
+    {
+      alloced++;
+      ret = xrealloc (ret, alloced);
+    }
+  ret[offset] = '\0';
+
   fclose (fp);
 
   return ret;