fixes deferred/release blocker issue #3797: Fixed the dbm, marshal, mmap,
ossaudiodev, & winreg modules to return bytes objects instead of bytearray
objects.
diff --git a/Misc/NEWS b/Misc/NEWS
index a914ebe..ef860a4 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -144,6 +144,9 @@
 - Issue #3492 and #3790: Fixed the zlib module and zipimport module uses of
   mutable bytearray objects where they should have been using immutable bytes.
 
+- Issue #3797: Fixed the dbm, marshal, mmap, ossaudiodev, & winreg modules to
+  return bytes objects instead of bytearray objects.
+
 
 Tools/Demos
 -----------
diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c
index 78eba36..d43acdc 100644
--- a/Modules/_dbmmodule.c
+++ b/Modules/_dbmmodule.c
@@ -111,7 +111,7 @@
 		PyErr_SetString(DbmError, "");
 		return NULL;
 	}
-	return PyByteArray_FromStringAndSize(drec.dptr, drec.dsize);
+	return PyBytes_FromStringAndSize(drec.dptr, drec.dsize);
 }
 
 static int
@@ -188,7 +188,7 @@
 		return NULL;
 	for (key = dbm_firstkey(dp->di_dbm); key.dptr;
 	     key = dbm_nextkey(dp->di_dbm)) {
-		item = PyByteArray_FromStringAndSize(key.dptr, key.dsize);
+		item = PyBytes_FromStringAndSize(key.dptr, key.dsize);
 		if (item == NULL) {
 			Py_DECREF(v);
 			return NULL;
@@ -260,7 +260,7 @@
         check_dbmobject_open(dp);
 	val = dbm_fetch(dp->di_dbm, key);
 	if (val.dptr != NULL)
-		return PyByteArray_FromStringAndSize(val.dptr, val.dsize);
+		return PyBytes_FromStringAndSize(val.dptr, val.dsize);
 	else {
 		Py_INCREF(defvalue);
 		return defvalue;
@@ -283,9 +283,9 @@
         check_dbmobject_open(dp);
 	val = dbm_fetch(dp->di_dbm, key);
 	if (val.dptr != NULL)
-		return PyByteArray_FromStringAndSize(val.dptr, val.dsize);
+		return PyBytes_FromStringAndSize(val.dptr, val.dsize);
 	if (defvalue == NULL) {
-		defvalue = PyByteArray_FromStringAndSize(NULL, 0);
+		defvalue = PyBytes_FromStringAndSize(NULL, 0);
 		if (defvalue == NULL)
 			return NULL;
 		val.dptr = NULL;
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index 9adef9b..6a2ebfd 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -228,7 +228,7 @@
 	else
 		++eol;		/* we're interested in the position after the
 				   newline. */
-	result = PyByteArray_FromStringAndSize(start, (eol - start));
+	result = PyBytes_FromStringAndSize(start, (eol - start));
 	self->pos += (eol - start);
 	return result;
 }
@@ -248,7 +248,7 @@
 	if (num_bytes > self->size - self->pos) {
 		num_bytes -= (self->pos+num_bytes) - self->size;
 	}
-	result = PyByteArray_FromStringAndSize(self->data+self->pos, num_bytes);
+	result = PyBytes_FromStringAndSize(self->data+self->pos, num_bytes);
 	self->pos += num_bytes;
 	return result;
 }
@@ -679,7 +679,7 @@
 		PyErr_SetString(PyExc_IndexError, "mmap index out of range");
 		return NULL;
 	}
-	return PyByteArray_FromStringAndSize(self->data + i, 1);
+	return PyBytes_FromStringAndSize(self->data + i, 1);
 }
 
 static PyObject *
@@ -769,14 +769,14 @@
 				"mmap object doesn't support item deletion");
 		return -1;
 	}
-	if (! (PyByteArray_Check(v) && PyByteArray_Size(v)==1) ) {
+	if (! (PyBytes_Check(v) && PyBytes_Size(v)==1) ) {
 		PyErr_SetString(PyExc_IndexError,
 				"mmap assignment must be length-1 bytes()");
 		return -1;
 	}
 	if (!is_writable(self))
 		return -1;
-	buf = PyByteArray_AsString(v);
+	buf = PyBytes_AsString(v);
 	self->data[i] = buf[0];
 	return 0;
 }
diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c
index 5828c3f..677f9ac 100644
--- a/Modules/ossaudiodev.c
+++ b/Modules/ossaudiodev.c
@@ -366,10 +366,10 @@
 
     if (!PyArg_ParseTuple(args, "i:read", &size))
         return NULL;
-    rv = PyByteArray_FromStringAndSize(NULL, size);
+    rv = PyBytes_FromStringAndSize(NULL, size);
     if (rv == NULL)
         return NULL;
-    cp = PyByteArray_AS_STRING(rv);
+    cp = PyBytes_AS_STRING(rv);
 
     Py_BEGIN_ALLOW_THREADS
     count = read(self->fd, cp, size);
@@ -381,7 +381,7 @@
         return NULL;
     }
     self->icount += count;
-    PyByteArray_Resize(rv, count);
+    _PyBytes_Resize(&rv, count);
     return rv;
 }
 
diff --git a/PC/winreg.c b/PC/winreg.c
index 1536e17..7d1d816 100644
--- a/PC/winreg.c
+++ b/PC/winreg.c
@@ -896,7 +896,7 @@
 				obData = Py_None;
 			}
 			else
-				obData = PyByteArray_FromStringAndSize(
+				obData = PyBytes_FromStringAndSize(
 					     (char *)retDataBuf, retDataSize);
 			break;
 	}
diff --git a/Python/marshal.c b/Python/marshal.c
index d3f2d7f..e7981b8 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -1093,7 +1093,7 @@
 	}
 	if (wf.str != NULL) {
 		/* XXX Quick hack -- need to do this differently */
-		res = PyByteArray_FromObject(wf.str);
+		res = PyBytes_FromObject(wf.str);
 		Py_DECREF(wf.str);
 	}
 	return res;
@@ -1134,9 +1134,9 @@
 		rf.ptr = PyBytes_AS_STRING(data);
 		rf.end = rf.ptr + PyBytes_GET_SIZE(data);
 	}
-	else if (PyByteArray_Check(data)) {
-		rf.ptr = PyByteArray_AS_STRING(data);
-		rf.end = rf.ptr + PyByteArray_GET_SIZE(data);
+	else if (PyBytes_Check(data)) {
+		rf.ptr = PyBytes_AS_STRING(data);
+		rf.end = rf.ptr + PyBytes_GET_SIZE(data);
 	}
 	else {
 		PyErr_Format(PyExc_TypeError,