From f41f8f99744230beb78efca71033a288107e3547 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 2 Apr 2015 09:47:27 +0300 Subject: [PATCH] Issue #22977: Fixed formatting Windows error messages on Wine. Patch by Martin Panter. --- Lib/test/test_exceptions.py | 10 +++++++++- Misc/NEWS | 3 +++ Python/errors.c | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index b35a5e4a57a..493cd2f83e3 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -6,10 +6,11 @@ import unittest import pickle import weakref import errno +import ctypes from test.support import (TESTFN, captured_output, check_impl_detail, check_warnings, cpython_only, gc_collect, run_unittest, - no_tracing, unlink) + no_tracing, unlink, get_attribute) class NaiveException(Exception): def __init__(self, x): @@ -245,6 +246,13 @@ class ExceptionTests(unittest.TestCase): self.assertEqual(w.strerror, 'foo') self.assertEqual(w.filename, None) + def test_windows_message(self): + """Should fill in unknown error code in Windows error message""" + windll = get_attribute(ctypes, "windll") + code = int.from_bytes(b"\xE0msc", "big") + with self.assertRaisesRegex(OSError, hex(code)): + windll.kernel32.RaiseException(code, 0, 0, None) + def testAttributes(self): # test that exception attributes are happy diff --git a/Misc/NEWS b/Misc/NEWS index 58cdebdee26..fd3856393b9 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Release date: tba Core and Builtins ----------------- +- Issue #22977: Fixed formatting Windows error messages on Wine. + Patch by Martin Panter. + - Issue #23803: Fixed str.partition() and str.rpartition() when a separator is wider then partitioned string. diff --git a/Python/errors.c b/Python/errors.c index a980481110b..b0ad9aa58b8 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -491,7 +491,7 @@ PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, P /* Only ever seen this in out-of-mem situations */ s_buf = NULL; - message = PyUnicode_FromFormat("Windows Error 0x%X", i); + message = PyUnicode_FromFormat("Windows Error 0x%x", i); } else { /* remove trailing cr/lf and dots */ while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.')) @@ -600,7 +600,7 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects( NULL); /* no args */ if (len==0) { /* Only seen this in out of mem situations */ - message = PyUnicode_FromFormat("Windows Error 0x%X", err); + message = PyUnicode_FromFormat("Windows Error 0x%x", err); s_buf = NULL; } else { /* remove trailing cr/lf and dots */