Package: wine
Version: 5.0-4
Severity: important

Hello.

Recently we hit a buffer overflow in wine_5.0-4.
There is was a mkdir error while creating "/run/$UID! /wine" dir
when running winecfg. The error was produced by wineserver32.

Take a look to strange "! " part after $UID - this looks like missing
\0 symbol in C char*.

Our $UIDs are produced by sssd which is joined to Active Directory domain.
$UID length is 10 chars.

I looked to "fixes/temporary-directory.patch" and found wrong usage of sizeof().

Patch attached for "debian/5.0-4" tag (bullseye branch).
It's also available at salsa [1] however MRs are disabled for wine-team/wine
project so I was unable to submit it.

[1] 
https://salsa.debian.org/nE0sIghT-guest/wine/-/commit/7867f27a582b3665844efcadc8003253ddebff9d
>From 7867f27a582b3665844efcadc8003253ddebff9d Mon Sep 17 00:00:00 2001
From: Yuri Konotopov <ykonoto...@gnome.org>
Date: Mon, 5 Oct 2020 21:47:00 +0400
Subject: [PATCH] Fix buffer overflow in fixes/temporary-directory.patch

Signed-off-by: Yuri Konotopov <ykonoto...@gnome.org>
---
 .../patches/fixes/temporary-directory.patch   | 22 +++++++++++--------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/debian/patches/fixes/temporary-directory.patch 
b/debian/patches/fixes/temporary-directory.patch
index 358ae18709..d7a48b3d5f 100644
--- a/debian/patches/fixes/temporary-directory.patch
+++ b/debian/patches/fixes/temporary-directory.patch
@@ -4,8 +4,10 @@ bug-debian: https://bugs.debian.org/903622
 bug-debian: https://bugs.debian.org/904041
 bug-upstream: https://bugs.winehq.org/show_bug.cgi?id=39013
 
---- a/libs/wine/config.c
-+++ b/libs/wine/config.c
+Index: wine/libs/wine/config.c
+===================================================================
+--- wine.orig/libs/wine/config.c
++++ wine/libs/wine/config.c
 @@ -25,6 +25,7 @@
  #include <stdarg.h>
  #include <stdlib.h>
@@ -63,8 +65,8 @@ bug-upstream: https://bugs.winehq.org/show_bug.cgi?id=39013
 +        }
 +        else
 +        {
-+            const char *tmp_default = "/tmp";
-+            tmp_dir = xmalloc( sizeof(tmp_default) + 1 );
++            const char tmp_default[] = "/tmp";
++            tmp_dir = xmalloc( sizeof(tmp_default) );
 +            strcpy( tmp_dir, tmp_default );
 +        }
 +
@@ -138,8 +140,10 @@ bug-upstream: https://bugs.winehq.org/show_bug.cgi?id=39013
  
      server_dir = xmalloc( strlen(root) + sizeof(server_dir_prefix) + 
2*sizeof(dev) + 2*sizeof(ino) + 2 );
      strcpy( server_dir, root );
---- a/server/request.c
-+++ b/server/request.c
+Index: wine/server/request.c
+===================================================================
+--- wine.orig/server/request.c
++++ wine/server/request.c
 @@ -21,6 +21,7 @@
  #include "config.h"
  #include "wine/port.h"
@@ -166,7 +170,7 @@ bug-upstream: https://bugs.winehq.org/show_bug.cgi?id=39013
  /* create the server directory and chdir to it */
  static char *create_server_dir( int force )
  {
-+    const char *server_root_prefix = "/run/user";
++    const char server_root_prefix[] = "/run/user";
      const char *prefix = getenv( "WINEPREFIX" );
 -    char *p, *config_dir;
 +    char *p, *config_dir, *run_dir;
@@ -181,13 +185,13 @@ bug-upstream: 
https://bugs.winehq.org/show_bug.cgi?id=39013
 -    if (!(server_dir = malloc( len ))) fatal_error( "out of memory\n" );
 -    sprintf( server_dir, "/tmp/.wine-%u", getuid() );
 +    /* use /run/user/$uid as wineserver's tmpdir by default */
-+    if (!(run_dir = malloc( sizeof(server_root_prefix) + 12 )))
++    if (!(run_dir = malloc( sizeof(server_root_prefix) + 13 )))
 +        fatal_error( "out of memory\n" );
 +    sprintf( run_dir, "%s/%u", server_root_prefix, getuid() );
 +
 +    if (opendir( run_dir )) /* use /run as the temporary directory */
 +    {
-+        len += sizeof(server_root_prefix) + 17;
++        len += strlen(run_dir) + 6;
 +        if (!(server_dir = malloc( len )))
 +            fatal_error( "out of memory\n" );
 +        sprintf( server_dir, "%s/wine", run_dir );
-- 
GitLab

Reply via email to