Fix bug #7781 (Samba transforms "ShareName" to lowercase when adding new share via...
[samba.git] / source3 / smbd / service.c
index bc2cdaf2d8574078a9db6cf89d8003d1ffbd7f37..5281ef32c93d80f6b4ebdf38ced5fc02cf837799 100644 (file)
@@ -300,14 +300,20 @@ int add_home_service(const char *service, const char *username, const char *home
 /**
  * Find a service entry.
  *
- * @param service is modified (to canonical form??)
+ * @param service_in is modified (to canonical form??)
+ * and returned in return parameter service.
  **/
 
-int find_service(fstring service)
+int find_service(const char *service_in, fstring service)
 {
        int iService;
        struct smbd_server_connection *sconn = smbd_server_conn;
 
+       if (!service_in) {
+               return -1;
+       }
+
+       fstrcpy(service, service_in);
        all_string_sub(service,"\\","/",0);
 
        iService = lp_servicenumber(service);
@@ -394,7 +400,7 @@ int find_service(fstring service)
                                goto fail;
                        }
 
-                       iService = find_service(defservice);
+                       iService = find_service(defservice, service);
                        if (iService >= 0) {
                                all_string_sub(service, "_","/",0);
                                iService = lp_add_service(service, iService);
@@ -746,6 +752,14 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
                        return NULL;
                }
 
+               /* We don't want to replace the original sanitized_username
+                  as it is the original user given in the connect attempt.
+                  This is used in '%U' substitutions. */
+               TALLOC_FREE(forced_serverinfo->sanitized_username);
+               forced_serverinfo->sanitized_username =
+                       talloc_move(forced_serverinfo,
+                                       &conn->server_info->sanitized_username);
+
                TALLOC_FREE(conn->server_info);
                conn->server_info = forced_serverinfo;
 
@@ -1169,7 +1183,7 @@ connection_struct *make_connection(struct smbd_server_connection *sconn,
                                fstrcpy(unix_username,
                                        current_user_info.smb_name);
                                map_username(sconn, unix_username);
-                               snum = find_service(unix_username);
+                               snum = find_service(unix_username, unix_username);
                        } 
                        if (snum != -1) {
                                DEBUG(5, ("making a connection to 'homes' "
@@ -1197,7 +1211,7 @@ connection_struct *make_connection(struct smbd_server_connection *sconn,
 
        strlower_m(service);
 
-       snum = find_service(service);
+       snum = find_service(service, service);
 
        if (snum < 0) {
                if (strequal(service,"IPC$") ||