diff --git a/src/operators.c b/src/operators.c
index f1a88c2e707e783691cc4470cf87f0a334a0670b..65eaccd6ae2f04542a908447dfc35da1c18dab25 100644
--- a/src/operators.c
+++ b/src/operators.c
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: operators.c,v 1.203 2005/01/14 10:00:54 nilsson Exp $
+|| $Id: operators.c,v 1.204 2005/04/08 16:59:18 grubba Exp $
 */
 
 #include "global.h"
@@ -5067,15 +5067,22 @@ struct program *string_assignment_program;
 
 #undef THIS
 #define THIS ((struct string_assignment_storage *)(CURRENT_STORAGE))
-/*! @decl int `[](int i, int j)
+/*! @decl int `[](int i)
  *!
  *! String index operator.
  */
 static void f_string_assignment_index(INT32 args)
 {
-  ptrdiff_t len = THIS->s->len;
+  ptrdiff_t len;
   INT_TYPE i, p;
-  get_all_args("string[]",args,"%i",&p);
+
+  get_all_args("string[]", args, "%i", &p);
+
+  if (!THIS->s) {
+    Pike_error("Indexing uninitialized string_assignment.\n");
+  }
+
+  len = THIS->s->len;
   i = p < 0 ? p + len : p;
   if(i<0 || i>=len)
     Pike_error("Index %"PRINTPIKEINT"d is out of string range "
@@ -5107,7 +5114,7 @@ static void f_string_assignment_assign_index(INT32 args)
       Pike_error("Index %"PRINTPIKEINT"d is out of string range "
 		 "%"PRINTPTRDIFFT"d..%"PRINTPTRDIFFT"d.\n",
 		 p, -len, len - 1);
-    free_string(THIS->s);
+    if (THIS->s) free_string(THIS->s);
     u->string=modify_shared_string(u->string,i,j);
     copy_shared_string(THIS->s, u->string);
   }
@@ -5135,9 +5142,9 @@ static void f_string_assignment_assign_index(INT32 args)
 
 static void init_string_assignment_storage(struct object *o)
 {
-  THIS->lval[0].type=T_INT;
-  THIS->lval[1].type=T_INT;
-  THIS->s=0;
+  THIS->lval[0].type = T_INT;
+  THIS->lval[1].type = T_INT;
+  THIS->s = NULL;
 }
 
 static void exit_string_assignment_storage(struct object *o)