s3-lib: Do not set an empty string in split_domain_user()
[vlendec/samba-autobuild/.git] / source3 / lib / util.c
index f64f6b56db15a7a0f979ac4303e8aa589d9c4f73..bab399824bf811f34fba93ac75c2f6d71e5d0068 100644 (file)
@@ -1150,13 +1150,13 @@ void set_namearray(name_compare_entry **ppname_array, const char *namelist_in)
  F_UNLCK in *ptype if the region is unlocked). False if the call failed.
 ****************************************************************************/
 
-bool fcntl_getlock(int fd, off_t *poffset, off_t *pcount, int *ptype, pid_t *ppid)
+bool fcntl_getlock(int fd, int op, off_t *poffset, off_t *pcount, int *ptype, pid_t *ppid)
 {
        struct flock lock;
        int ret;
 
-       DEBUG(8,("fcntl_getlock fd=%d offset=%.0f count=%.0f type=%d\n",
-                   fd,(double)*poffset,(double)*pcount,*ptype));
+       DEBUG(8,("fcntl_getlock fd=%d op=%d offset=%.0f count=%.0f type=%d\n",
+                   fd,op,(double)*poffset,(double)*pcount,*ptype));
 
        lock.l_type = *ptype;
        lock.l_whence = SEEK_SET;
@@ -1164,7 +1164,7 @@ bool fcntl_getlock(int fd, off_t *poffset, off_t *pcount, int *ptype, pid_t *ppi
        lock.l_len = *pcount;
        lock.l_pid = 0;
 
-       ret = sys_fcntl_ptr(fd,F_GETLK,&lock);
+       ret = sys_fcntl_ptr(fd,op,&lock);
 
        if (ret == -1) {
                int sav = errno;
@@ -1184,6 +1184,37 @@ bool fcntl_getlock(int fd, off_t *poffset, off_t *pcount, int *ptype, pid_t *ppi
        return True;
 }
 
+#if defined(HAVE_OFD_LOCKS)
+int map_process_lock_to_ofd_lock(int op, bool *use_ofd_locks)
+{
+       switch (op) {
+       case F_GETLK:
+       case F_OFD_GETLK:
+               op = F_OFD_GETLK;
+               break;
+       case F_SETLK:
+       case F_OFD_SETLK:
+               op = F_OFD_SETLK;
+               break;
+       case F_SETLKW:
+       case F_OFD_SETLKW:
+               op = F_OFD_SETLKW;
+               break;
+       default:
+               *use_ofd_locks = false;
+               return -1;
+       }
+       *use_ofd_locks = true;
+       return op;
+}
+#else /* HAVE_OFD_LOCKS */
+int map_process_lock_to_ofd_lock(int op, bool *use_ofd_locks)
+{
+       *use_ofd_locks = false;
+       return op;
+}
+#endif /* HAVE_OFD_LOCKS */
+
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_ALL
 
@@ -2072,7 +2103,7 @@ int get_safe_IVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, i
  call (they take care of winbind separator and other winbind specific settings).
 ****************************************************************/
 
-void split_domain_user(TALLOC_CTX *mem_ctx,
+bool split_domain_user(TALLOC_CTX *mem_ctx,
                       const char *full_name,
                       char **domain,
                       char **user)
@@ -2084,11 +2115,23 @@ void split_domain_user(TALLOC_CTX *mem_ctx,
        if (p != NULL) {
                *domain = talloc_strndup(mem_ctx, full_name,
                                         PTR_DIFF(p, full_name));
+               if (*domain == NULL) {
+                       return false;
+               }
                *user = talloc_strdup(mem_ctx, p+1);
+               if (*user == NULL) {
+                       TALLOC_FREE(*domain);
+                       return false;
+               }
        } else {
-               *domain = talloc_strdup(mem_ctx, "");
+               *domain = NULL;
                *user = talloc_strdup(mem_ctx, full_name);
+               if (*user == NULL) {
+                       return false;
+               }
        }
+
+       return true;
 }
 
 /****************************************************************