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…
==============================================================================
--- 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;
}