Skip to content

Commit

Permalink
Merge pull request #1 from RemcodM/master
Browse files Browse the repository at this point in the history
Fixing security bugs and memory leaks.
  • Loading branch information
jsardo authored Dec 6, 2017
2 parents c793bc8 + 00f1d8a commit 5fe3ffd
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 26 deletions.
20 changes: 16 additions & 4 deletions arg_parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ int get_argc(char *s)
sp++;
if (*sp == '\0')
return count;
else
else
count++;
while (!isspace(*sp) && *sp != '\0')
sp++;
Expand All @@ -33,7 +33,7 @@ char **get_args(char *s, int index)
{
char **args, arg[BUFSIZE], *argp;
int i;
args = (char **) malloc (BUFSIZ);
args = (char **) malloc (BUFSIZE);

s += index;
_argc = get_argc(s);
Expand All @@ -48,7 +48,7 @@ char **get_args(char *s, int index)
_argc--;
goto top;
}
while (!isspace(*s) || *s == '\0')
while (!isspace(*s) && *s != '\0')
*argp++ = *s++;

*argp = '\0';
Expand All @@ -58,8 +58,9 @@ char **get_args(char *s, int index)
return args;
}

char *get_flags(char *buf, char *flags)
char *get_flags(char *buf)
{
char* flags = (char *) malloc(BUFSIZE);
while (*buf != '\0') {
if (*buf == '-') {
buf++;
Expand All @@ -71,3 +72,14 @@ char *get_flags(char *buf, char *flags)
*flags = '\0';
return flags;
}

void free_args(char **args) {
for (int i = 0; i < _argc; i++) {
free(args[i]);
}
free(args);
}

void free_flags(char *flags) {
free(flags);
}
5 changes: 3 additions & 2 deletions arg_parse.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
int get_argc(char *s);
char *skip_flag(char *s);
char **get_args(char *s, int index);
char *get_flags(char *buf, char *flags);

char *get_flags(char *buf);
void free_args(char **args);
void free_flags(char *flags);
#endif
7 changes: 5 additions & 2 deletions cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ int cat(const char *name, int nflag)
if (c != '\n')
putchar('\n');

fclose(fp);

return 0;
}

Expand Down Expand Up @@ -172,7 +174,8 @@ int main(void)
getcwd(cwd, BUFSIZE);
printf("cli:%s%% ", (cwd == NULL) ? "" : cwd);

gets(buf);
fgets(buf, BUFSIZE, stdin);

if (strlen(buf) == 0)
continue;
if (strncmp(buf, "rm", 2) == 0 && !isalnum(buf[2]))
Expand All @@ -194,7 +197,7 @@ int main(void)
else
printf("cli: not a valid command.\n"
"type 'help' for a list of options\n\n");
} while (strcmp(buf, "exit") != 0);
} while (strcmp(buf, "exit\n") != 0);

return 0;
}
39 changes: 24 additions & 15 deletions cmd_mains.c
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
#include "misc.h"
#include "cmd_mains.h"
#include "arg_parse.h"

int rm_main(char *buf)
{
char **args, flags[5];
char **args;
int pflag = 0, vflag = 0, rflag = 0, hflag = 0, i = 0;

args = get_args(buf, 2);
get_flags(buf, flags);
char* flags = get_flags(buf);

if (flags[0] != '\0') {
do {
switch (flags[i])
Expand Down Expand Up @@ -45,16 +46,19 @@ int rm_main(char *buf)
for (i = 0; i < _argc; ++i) {
rm(args[i], vflag, pflag, rflag);
}

free_args(args);
free_flags(flags);
return 0;
}

int ls_main(char *buf)
{
char **args, flags[4];
char **args;
int aflag = 0, iflag = 0, rflag = 0, hflag = 0, i = 0;

args = get_args(buf, 2);
get_flags(buf, flags);
char* flags = get_flags(buf);

if (flags[0] != '\0') {
do {
Expand Down Expand Up @@ -94,16 +98,18 @@ int ls_main(char *buf)
} else
ls(args[0], aflag, iflag, rflag);

free_args(args);
free_flags(flags);
return 0;
}

int mkdir_main(char *buf)
{
char **args, flags[5];
char **args;
int vflag = 0, hflag = 0, i = 0;

args = get_args(buf, 5);
get_flags(buf, flags);
char* flags = get_flags(buf);

if (flags[0] != '\0') {
do {
Expand All @@ -130,22 +136,23 @@ int mkdir_main(char *buf)
if (_argc == 0) {
printf("mkdir: no arguments given\n\n");
goto mkdir_usage;
return 1;
} else {
for (i = 0; i < _argc; ++i)
for (i = 0; i < _argc; ++i)
makedir(args[i], vflag);
}

free_args(args);
free_flags(flags);
return 0;
}

int cat_main(char *buf)
{
char **args, flags[5];
char **args;
int nflag = 0, hflag = 0, i = 0;

args = get_args(buf, 3);
get_flags(buf, flags);
char* flags = get_flags(buf);

if (flags[0] != '\0') {
do {
Expand Down Expand Up @@ -178,6 +185,8 @@ int cat_main(char *buf)
} else
cat(args[0], nflag);

free_args(args);
free_flags(flags);
return 0;
}

Expand All @@ -199,6 +208,6 @@ int cd_main(char *buf)
else
cd(args[0]);

free_args(args);
return 0;
}

}
1 change: 0 additions & 1 deletion cmd_mains.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,4 @@ int cat(const char *name, int nflag);
int cat_main(char *buf);
int cd(const char *name);
int cd_main(char *buf);

#endif
1 change: 0 additions & 1 deletion misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ void usage(void)
"cd\tchange working directory.\n\n"
"appending \" -h\" to most commands will give\n"
"additional info regarding that command\n\n");
exit(0);
}

char *strdup(const char *s)
Expand Down
2 changes: 1 addition & 1 deletion misc.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ void usage(void);
int get_argc(char *s);
char **get_args(char *s, int index);
char *skip_flags(char *s);
char *get_flags(char *buf, char *flags);
char *get_flags(char *buf);
bool prompt(char *fmt, ...);

#endif

0 comments on commit 5fe3ffd

Please sign in to comment.