summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2007-04-16 19:10:16 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:19:23 -0500
commit74a07edb505c9f20a93c00da06cb5c997b6b3c8a (patch)
tree443db34b14a6edd4931e18b2fd746ace0acf4ee8
parent4341be45935487a50ff7cde28387f47fe74b13ac (diff)
downloadsamba-74a07edb505c9f20a93c00da06cb5c997b6b3c8a.tar.gz
samba-74a07edb505c9f20a93c00da06cb5c997b6b3c8a.tar.bz2
samba-74a07edb505c9f20a93c00da06cb5c997b6b3c8a.zip
r22266: Fix bug #4512 - we were returning a volume label greater than
32 unicode chars. Windows XP doesn't like that :-). Jeremy (This used to be commit e59b5276b56d6963ddd0598bbd1b15426d2d13e8)
-rw-r--r--source3/include/smb.h2
-rw-r--r--source3/param/loadparm.c19
-rw-r--r--source3/smbd/connection.c8
-rw-r--r--source3/smbd/trans2.c4
4 files changed, 21 insertions, 12 deletions
diff --git a/source3/include/smb.h b/source3/include/smb.h
index 8f54ed7b84..a9c57f77f2 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -878,7 +878,7 @@ struct connections_data {
int cnum;
uid_t uid;
gid_t gid;
- char name[24];
+ char servicename[FSTRING_LEN];
char addr[24];
char machine[FSTRING_LEN];
time_t start;
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index a049b2d47a..ea434e4768 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -5299,15 +5299,22 @@ struct share_params *snum2params_static(int snum)
A useful volume label function.
********************************************************************/
-char *volume_label(int snum)
+const char *volume_label(int snum)
{
- char *ret = lp_volume(snum);
- if (!*ret)
- return lp_servicename(snum);
- return (ret);
+ char *ret;
+ const char *label = lp_volume(snum);
+ if (!*label) {
+ label = lp_servicename(snum);
+ }
+
+ /* This returns a 33 byte guarenteed null terminated string. */
+ ret = talloc_strndup(main_loop_talloc_get(), label, 32);
+ if (!ret) {
+ return "";
+ }
+ return ret;
}
-
/*******************************************************************
Set the server type we will announce as via nmbd.
********************************************************************/
diff --git a/source3/smbd/connection.c b/source3/smbd/connection.c
index 7e53a29b04..5c31a5460b 100644
--- a/source3/smbd/connection.c
+++ b/source3/smbd/connection.c
@@ -108,13 +108,13 @@ static int count_fn( TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *u
if (cs->Clear && !process_exists(crec.pid) && (errno == ESRCH)) {
DEBUG(2,("pid %s doesn't exist - deleting connections %d [%s]\n",
- procid_str_static(&crec.pid), crec.cnum, crec.name));
+ procid_str_static(&crec.pid), crec.cnum, crec.servicename));
if (tdb_delete(the_tdb, kbuf) != 0)
DEBUG(0,("count_fn: tdb_delete failed with error %s\n", tdb_errorstr(tdb) ));
return 0;
}
- if (strequal(crec.name, cs->name))
+ if (strequal(crec.servicename, cs->name))
cs->curr_connections++;
return 0;
@@ -191,8 +191,8 @@ BOOL claim_connection(connection_struct *conn, const char *name,int max_connecti
if (conn) {
crec.uid = conn->uid;
crec.gid = conn->gid;
- safe_strcpy(crec.name,
- lp_servicename(SNUM(conn)),sizeof(crec.name)-1);
+ safe_strcpy(crec.servicename,
+ lp_servicename(SNUM(conn)),sizeof(crec.servicename)-1);
}
crec.start = time(NULL);
crec.bcast_msg_flags = msg_flags;
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 04969784c0..8f1226c666 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -2247,7 +2247,7 @@ static int call_trans2qfsinfo(connection_struct *conn, char *inbuf, char *outbuf
uint16 info_level;
int data_len, len;
SMB_STRUCT_STAT st;
- char *vname = volume_label(SNUM(conn));
+ const char *vname = volume_label(SNUM(conn));
int snum = SNUM(conn);
char *fstype = lp_fstype(SNUM(conn));
int quota_flag = 0;
@@ -2368,9 +2368,11 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)st.st_dev, (unsi
SIVAL(pdata,8,str_checksum(lp_servicename(snum)) ^
(str_checksum(get_local_machine_name())<<16));
+ /* Max label len is 32 characters. */
len = srvstr_push(outbuf, pdata+18, vname, -1, STR_UNICODE);
SIVAL(pdata,12,len);
data_len = 18+len;
+
DEBUG(5,("call_trans2qfsinfo : SMB_QUERY_FS_VOLUME_INFO namelen = %d, vol=%s serv=%s\n",
(int)strlen(vname),vname, lp_servicename(snum)));
break;