Fix CID: 456 - resource leak on function exit.
authorJeremy Allison <jra@samba.org>
Thu, 30 Oct 2008 00:07:14 +0000 (17:07 -0700)
committerJeremy Allison <jra@samba.org>
Thu, 30 Oct 2008 00:07:14 +0000 (17:07 -0700)
Jeremy.

source3/client/mount.cifs.c

index fd8014cf9ff7c5248cb955a7f02b9d9c32bce7c3..2a9c2b73041a222be23a69dbda1e076355111be9 100644 (file)
@@ -441,6 +441,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
                                        goto nocopy;
                                } else {
                                        printf("username specified with no parameter\n");
+                                       SAFE_FREE(out);
                                        return 1;       /* needs_arg; */
                                }
                        } else {
@@ -473,6 +474,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
                                        domain_name = check_for_domain(&value);
                                } else {
                                        printf("username too long\n");
+                                       SAFE_FREE(out);
                                        return 1;
                                }
                        }
@@ -488,6 +490,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
                                got_password = 1;
                        } else {
                                printf("password too long\n");
+                               SAFE_FREE(out);
                                return 1;
                        }
                } else if (strncmp(data, "sec", 3) == 0) {
@@ -505,6 +508,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
                                got_ip = 1;
                        } else {
                                printf("ip address too long\n");
+                               SAFE_FREE(out);
                                return 1;
                        }
                } else if ((strncmp(data, "unc", 3) == 0)
@@ -512,6 +516,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
                   || (strncmp(data, "path", 4) == 0)) {
                        if (!value || !*value) {
                                printf("invalid path to network resource\n");
+                               SAFE_FREE(out);
                                return 1;  /* needs_arg; */
                        } else if(strnlen(value,5) < 5) {
                                printf("UNC name too short");
@@ -526,6 +531,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
                                                got_unc = 1;
                                } else if (strncmp(value, "\\\\", 2) != 0) {                       
                                        printf("UNC Path does not begin with // or \\\\ \n");
+                                       SAFE_FREE(out);
                                        return 1;
                                } else {
                                        if(got_unc)
@@ -535,6 +541,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
                                }
                        } else {
                                printf("CIFS: UNC name too long\n");
+                               SAFE_FREE(out);
                                return 1;
                        }
                } else if ((strncmp(data, "dom" /* domain */, 3) == 0)
@@ -544,12 +551,14 @@ static int parse_options(char ** optionsp, int * filesys_flags)
                           and "WORKGRP" etc. */
                        if (!value || !*value) {
                                printf("CIFS: invalid domain name\n");
+                               SAFE_FREE(out);
                                return 1;       /* needs_arg; */
                        }
                        if (strnlen(value, DOMAIN_SIZE+1) < DOMAIN_SIZE+1) {
                                got_domain = 1;
                        } else {
                                printf("domain name too long\n");
+                               SAFE_FREE(out);
                                return 1;
                        }
                } else if (strncmp(data, "cred", 4) == 0) {
@@ -558,10 +567,12 @@ static int parse_options(char ** optionsp, int * filesys_flags)
                                if(rc) {
                                        printf("error %d (%s) opening credential file %s\n",
                                                rc, strerror(rc), value);
+                                       SAFE_FREE(out);
                                        return 1;
                                }
                        } else {
                                printf("invalid credential file name specified\n");
+                               SAFE_FREE(out);
                                return 1;
                        }
                } else if (strncmp(data, "uid", 3) == 0) {
@@ -600,6 +611,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
                } else if (strcmp(data, "file_mode") == 0 || strcmp(data, "fmask")==0) {
                        if (!value || !*value) {
                                printf ("Option '%s' requires a numerical argument\n", data);
+                               SAFE_FREE(out);
                                return 1;
                        }
 
@@ -614,6 +626,7 @@ static int parse_options(char ** optionsp, int * filesys_flags)
                } else if (strcmp(data, "dir_mode") == 0 || strcmp(data, "dmask")==0) {
                        if (!value || !*value) {
                                printf ("Option '%s' requires a numerical argument\n", data);
+                               SAFE_FREE(out);
                                return 1;
                        }