Somewhere along the way, the softspace attr of file objects became read-
only.  Repaired, and added new tests to test_file.py.
diff --git a/Lib/test/test_file.py b/Lib/test/test_file.py
index be1b2de..677dafc 100644
--- a/Lib/test/test_file.py
+++ b/Lib/test/test_file.py
@@ -5,6 +5,26 @@
 from test.test_support import verify, TESTFN, TestFailed
 from UserList import UserList
 
+# verify expected attributes exist
+f = file(TESTFN, 'w')
+softspace = f.softspace
+f.name     # merely shouldn't blow up
+f.mode     # ditto
+f.closed   # ditto
+
+# verify softspace is writable
+f.softspace = softspace    # merely shouldn't blow up
+
+# verify the others aren't
+for attr in 'name', 'mode', 'closed':
+    try:
+        setattr(f, attr, 'oops')
+    except TypeError:
+        pass
+    else:
+        raise TestFailed('expected TypeError setting file attr %r' % attr)
+f.close()
+
 # verify writelines with instance sequence
 l = UserList(['1', '2'])
 f = open(TESTFN, 'wb')
diff --git a/Misc/NEWS b/Misc/NEWS
index 05c9ce2..3ff9a64 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@
 Core and builtins
 -----------------
 
+- The softspace attribute of file objects became read-only by oversight.
+  It's writable again.
+
 Extension modules
 -----------------
 
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index 5b2267b..92cfa5b 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -1962,7 +1962,8 @@
 	0,					/* tp_call */
 	0,					/* tp_str */
 	PyObject_GenericGetAttr,		/* tp_getattro */
-	0,					/* tp_setattro */
+	/* softspace is writable:  we must supply tp_setattro */
+	PyObject_GenericSetAttr,		/* tp_setattro */
 	0,					/* tp_as_buffer */
 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
 	file_doc,				/* tp_doc */