From 8b5bef1ad1ad81ce614ba422a7d4cd8c0c15106d Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 6 Sep 2006 00:35:27 +0000 Subject: [PATCH] r18116: Make max usershares an advisory limit, pointed out by Cybionet . Jeremy. (This used to be commit fb755e83ee98fb830fb2340f175e8ca8d89c84d5) --- source3/utils/net_usershare.c | 68 +++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/source3/utils/net_usershare.c b/source3/utils/net_usershare.c index 7d6f8d56e27..6a306a99830 100644 --- a/source3/utils/net_usershare.c +++ b/source3/utils/net_usershare.c @@ -457,6 +457,63 @@ static int net_usershare_info(int argc, const char **argv) return ret; } +/*************************************************************************** + Count the current total number of usershares. +***************************************************************************/ + +static int count_num_usershares(void) +{ + SMB_STRUCT_DIR *dp; + SMB_STRUCT_DIRENT *de; + pstring basepath; + int num_usershares = 0; + + get_basepath(basepath); + dp = sys_opendir(basepath); + if (!dp) { + d_fprintf(stderr, "count_num_usershares: cannot open usershare directory %s. Error %s\n", + basepath, strerror(errno) ); + return -1; + } + + while((de = sys_readdir(dp)) != 0) { + SMB_STRUCT_STAT sbuf; + pstring path; + const char *n = de->d_name; + + /* Ignore . and .. */ + if (*n == '.') { + if ((n[1] == '\0') || (n[1] == '.' && n[2] == '\0')) { + continue; + } + } + + if (!validate_net_name(n, INVALID_SHARENAME_CHARS, strlen(n))) { + d_fprintf(stderr, "count_num_usershares: ignoring bad share name %s\n",n); + continue; + } + pstrcpy(path, basepath); + pstrcat(path, "/"); + pstrcat(path, n); + + if (sys_lstat(path, &sbuf) != 0) { + d_fprintf(stderr, "count_num_usershares: can't lstat file %s. Error was %s\n", + path, strerror(errno) ); + continue; + } + + if (!S_ISREG(sbuf.st_mode)) { + d_fprintf(stderr, "count_num_usershares: file %s is not a regular file. Ignoring.\n", + path ); + continue; + } + num_usershares++; + } + + sys_closedir(dp); + return num_usershares; +} + /*************************************************************************** Add a single userlevel share. ***************************************************************************/ @@ -481,6 +538,7 @@ static int net_usershare_add(int argc, const char **argv) size_t to_write; uid_t myeuid = geteuid(); BOOL guest_ok = False; + int num_usershares; us_comment = ""; arg_acl = "S-1-1-0:R"; @@ -528,6 +586,16 @@ static int net_usershare_add(int argc, const char **argv) break; } + /* Ensure we're under the "usershare max shares" number. Advisory only. */ + num_usershares = count_num_usershares(); + if (num_usershares > lp_usershare_max_shares()) { + d_fprintf(stderr, "net usershare add: too many usershares already defined (%d), " + "maximum number allowed is %d.\n", + num_usershares, lp_usershare_max_shares() ); + SAFE_FREE(sharename); + return -1; + } + if (!validate_net_name(sharename, INVALID_SHARENAME_CHARS, strlen(sharename))) { d_fprintf(stderr, "net usershare add: share name %s contains " "invalid characters (any of %s)\n", -- 2.34.1