changeset 1389:e59d4322331b draft

fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong. fsck: memory leak/segfault resolved. ftpget : warning for unused variable 'ptr' removed.
author Ashwini Sharma <ak.ashwini1981@gmail.com>
date Mon, 14 Jul 2014 05:44:29 -0500
parents c4f5f82adce6
children c18ad59ae442
files toys/pending/fdisk.c toys/pending/fsck.c toys/pending/ftpget.c
diffstat 3 files changed, 22 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/toys/pending/fdisk.c	Mon Jul 14 05:38:27 2014 -0500
+++ b/toys/pending/fdisk.c	Mon Jul 14 05:44:29 2014 -0500
@@ -243,6 +243,13 @@
 
   if (!extended_offset) extended_offset = local_start_off;
   do {
+    if (num_parts >= 60) {
+      xprintf("Warning: deleting partitions after 60\n");
+      memset(q, 0, sizeof(struct partition)); //clear_partition
+      partitions[num_parts-1].modified = 1;
+      break;
+    }
+
     sec_buf = xzalloc(g_sect_size);
     partitions[num_parts].part = part_offset(sec_buf, 0);
     partitions[num_parts].sec_buffer = sec_buf;
@@ -258,7 +265,7 @@
     }
     num_parts++; //extended partions present.
     q = part_offset(sec_buf, 1);
-  } while (!is_partition_clear(q));
+  } while (!is_partition_clear(q) && IS_EXTENDED(q->sys_ind));
 }
 
 static void physical_HS(int* h, int *s)
@@ -461,7 +468,7 @@
     p = partitions[i].part;
     if (is_partition_clear(p)) continue;
 
-    boot = p->boot_ind == 0x80?'*':' ';
+    boot = ((p->boot_ind == 0x80)?'*':(!p->boot_ind)?' ':'?');
     start_sec = swap_le32toh(p->start4) + partitions[i].start_offset;
     secs = swap_le32toh(p->size4);
 
@@ -872,8 +879,11 @@
 
   if (idx >= 4) limit = end[ext_idx];
 
-  for (i = 0; i < num_parts; i++)
+  for (i = 0; i < num_parts; i++) {
+    struct part_entry *pe = &partitions[i];
+    if (start < pe->start_offset && limit >= pe->start_offset) limit = pe->start_offset - 1;
     if (start < begin[i] && limit >= begin[i]) limit = begin[i] - 1;
+  }
 
   start_cyl = start/(g_sectors * g_heads) + 1;
   limit_cyl = limit/(g_sectors * g_heads) + 1;
@@ -949,7 +959,7 @@
     p = partitions[idx-1].part + 1; //extended pointer for logical partitions
     set_levalue(p->start4, pe->start_offset - extended_offset);
     set_levalue(p->size4, end - start + 1 + (dos_flag? g_sectors: 1));
-    set_hsc(p, start, end);
+    set_hsc(p, pe->start_offset, end);
     p->boot_ind = 0;  
     p->sys_ind = EXTENDED;
     partitions[idx-1].modified = 1;   
--- a/toys/pending/fsck.c	Mon Jul 14 05:38:27 2014 -0500
+++ b/toys/pending/fsck.c	Mon Jul 14 05:44:29 2014 -0500
@@ -215,8 +215,10 @@
     xputc('\n');
   }
 
-  if (toys.optflags & FLAG_N) return;
-  else { 
+  if (toys.optflags & FLAG_N) {
+    free(args);
+    return;
+  } else { 
     if ((pid = fork()) < 0) {
       perror_msg(args[0]);
       return; 
@@ -244,12 +246,13 @@
 {
   pid_t pid;
   int status = 0, child_exited;
-  struct child_list *prev, *temp = c_list;
-  prev = temp;
+  struct child_list *prev, *temp;
 
   errno = 0;
   if (!c_list) return 0;
   while ((pid = wait(&status))) {
+    temp = c_list;
+    prev = temp;
     if (TT.sig_num) kill_all();
     child_exited = 0;
     if (pid < 0) {
--- a/toys/pending/ftpget.c	Mon Jul 14 05:38:27 2014 -0500
+++ b/toys/pending/ftpget.c	Mon Jul 14 05:44:29 2014 -0500
@@ -129,7 +129,7 @@
 static void get_sockaddr(char *host)
 {  
   struct addrinfo hints, *result;
-  char *ptr, port[6];
+  char port[6];
   int status;
   
   errno = 0;