Author: hbelusca
Date: Sun Mar 29 22:26:24 2015
New Revision: 66972

URL: http://svn.reactos.org/svn/reactos?rev=66972&view=rev
Log:
[SORT]
- Don't leak memory, see CORE-8205 for more details.
- Replace tabs with spaces.

Modified:
    trunk/reactos/base/applications/cmdutils/sort/sort.c

Modified: trunk/reactos/base/applications/cmdutils/sort/sort.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/cmdutils/sort/sort.c?rev=66972&r1=66971&r2=66972&view=diff
==============================================================================
--- trunk/reactos/base/applications/cmdutils/sort/sort.c        [iso-8859-1] 
(original)
+++ trunk/reactos/base/applications/cmdutils/sort/sort.c        [iso-8859-1] 
Sun Mar 29 22:26:24 2015
@@ -1,60 +1,61 @@
 /*
-*    SORT - reads line of a file and sorts them in order
-*    Copyright  1995  Jim Lynch
-*
-*    Adapted for ReactOS
-*
-*    This program is free software; you can redistribute it and/or modify
-*    it under the terms of the GNU General Public License as published by
-*    the Free Software Foundation; either version 2 of the License, or
-*    (at your option) any later version.
-*
-*    This program is distributed in the hope that it will be useful,
-*    but WITHOUT ANY WARRANTY; without even the implied warranty of
-*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*    GNU General Public License for more details.
-*
-*    You should have received a copy of the GNU General Public License
-*    along with this program; if not, write to the Free Software
-*    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ *    SORT - reads line of a file and sorts them in order
+ *    Copyright  1995  Jim Lynch
+ *
+ *    Adapted for ReactOS
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    This program is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with this program; if not, write to the Free Software
+ *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
 
+#include <stdio.h>
 #include <stdlib.h>
-#include <stdio.h>
 #include <string.h>
 #include <malloc.h>
 
-#define MAXRECORDS  65536      /* maximum number of records that can be
-                                * sorted */
-#define MAXLEN 4095            /* maximum record length */
+#define MAXRECORDS  65536   /* maximum number of records that can be sorted */
+#define MAXLEN      4095    /* maximum record length */
 
-int             rev;           /* reverse flag */
-int             help;          /* help flag */
-int             sortcol;       /* sort column */
-int             err = 0;       /* error counter */
+int rev;        /* reverse flag */
+int help;       /* help flag */
+int sortcol;    /* sort column */
+int err = 0;    /* error counter */
 
 int
 cmpr(const void *a, const void *b)
 {
-    char           *A, *B;
+    char *A, *B;
 
     A = *(char **) a;
     B = *(char **) b;
 
-    if (sortcol > 0) {
-       if (strlen(A) > sortcol)
-           A += sortcol;
-       else
-           A = "";
-       if (strlen(B) > sortcol)
-           B += sortcol;
-       else
-           B = "";
+    if (sortcol > 0)
+    {
+        if (strlen(A) > sortcol)
+            A += sortcol;
+        else
+            A = "";
+        if (strlen(B) > sortcol)
+            B += sortcol;
+        else
+            B = "";
     }
+
     if (!rev)
-       return strcmp(A, B);
+        return strcmp(A, B);
     else
-       return strcmp(B, A);
+        return strcmp(B, A);
 }
 
 void
@@ -62,79 +63,126 @@
 {
     fputs("SORT\n", stderr);
     fputs("Sorts input and writes output to a file, console or a device.\n", 
stderr);
+
     if (err)
-       fputs("Invalid parameter\n", stderr);
+        fputs("Invalid parameter\n", stderr);
+
     fputs("    SORT [options] < [drive:1][path1]file1 > 
[drive2:][path2]file2\n", stderr);
     fputs("    Command | SORT [options] > [drive:][path]file\n", stderr);
     fputs("    Options:\n", stderr);
-    fputs("    /R      Reverse order\n", stderr);
-    fputs("    /+n     Start sorting with column n\n", stderr);
-    fputs("    /?      Help\n", stderr);
+    fputs("    /R   Reverse order\n", stderr);
+    fputs("    /+n  Start sorting with column n\n", stderr);
+    fputs("    /?   Help\n", stderr);
 }
 
 int main(int argc, char **argv)
 {
-    char            temp[MAXLEN + 1];
-    char          **list;
-    char           *cp;                /* option character pointer */
-    int             nr;
-    int             i;
-
+    char temp[MAXLEN + 1];
+    char **list;
+    char *cp;   /* option character pointer */
+    int  nr;
+    int  i;
 
     sortcol = 0;
     rev = 0;
-    while (--argc) {
-       if (*(cp = *++argv) == '/') {
-           switch (cp[1]) {
-           case 'R':
-           case 'r':
-               rev = 1;
-               break;
-           case '?':
-           case 'h':
-           case 'H':
-               help = 1;
-               break;
-           case '+':
-               sortcol = atoi(cp + 1);
-               if (sortcol)
-                   sortcol--;
-               break;
-           default:
-               err++;
-           }
-       }
+    while (--argc)
+    {
+        if (*(cp = *++argv) == '/')
+        {
+            switch (cp[1])
+            {
+                case 'R':
+                case 'r':
+                    rev = 1;
+                    break;
+
+                case '?':
+                case 'h':
+                case 'H':
+                    help = 1;
+                    break;
+
+                case '+':
+                    sortcol = atoi(cp + 1);
+                    if (sortcol)
+                        sortcol--;
+                    break;
+
+                default:
+                    err++;
+            }
+        }
     }
-    if (err || help) {
-       usage();
-       exit(1);
+
+    if (err || help)
+    {
+        usage();
+        exit(1);
     }
+
     list = (char **) malloc(MAXRECORDS * sizeof(char *));
-    if (list == NULL) {
+    if (list == NULL)
+    {
         fputs("SORT: Insufficient memory\n", stderr);
         exit(3);
     }
-    for (nr = 0; nr < MAXRECORDS; nr++) {
-       if (fgets(temp, MAXLEN, stdin) == NULL)
-           break;
-       if(strlen(temp))
-           temp[strlen(temp)-1]='\0';
-       list[nr] = (char *) malloc(strlen(temp) + 1);
-       if (list[nr] == NULL) {
-           fputs("SORT: Insufficient memory\n", stderr);
-           exit(3);
-       }
-       strcpy(list[nr], temp);
+
+    for (nr = 0; nr < MAXRECORDS; nr++)
+    {
+        if (fgets(temp, MAXLEN, stdin) == NULL)
+            break;
+
+        if(strlen(temp))
+            temp[strlen(temp)-1]='\0';
+
+        list[nr] = (char *) malloc(strlen(temp) + 1);
+        if (list[nr] == NULL)
+        {
+            fputs("SORT: Insufficient memory\n", stderr);
+
+            /* Cleanup memory */
+            for (i = 0; i < nr; i++)
+            {
+                free(list[i]);
+            }
+            free(list);
+
+            exit(3);
+        }
+
+        strcpy(list[nr], temp);
     }
-    if (nr == MAXRECORDS) {
-       fputs("SORT: number of records exceeds maximum\n", stderr);
-       exit(4);
+
+    if (nr == MAXRECORDS)
+    {
+        fputs("SORT: number of records exceeds maximum\n", stderr);
+
+        /* Cleanup memory */
+        for (i = 0; i < nr; i++)
+        {
+            free(list[i]);
+        }
+        free(list);
+
+        /* Bail out */
+        exit(4);
     }
+
     qsort((void *) list, nr, sizeof(char *), cmpr);
-    for (i = 0; i < nr; i++) {
-       fputs(list[i], stdout);
-       fputs("\n",stdout);
+
+    for (i = 0; i < nr; i++)
+    {
+        fputs(list[i], stdout);
+        fputs("\n",stdout);
     }
+
+    /* Cleanup memory */
+    for (i = 0; i < nr; i++)
+    {
+        free(list[i]);
+    }
+    free(list);
+
     return 0;
 }
 


Reply via email to