diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
index 2f391c5..47190d2 100644
--- a/src/mesa/main/attrib.c
+++ b/src/mesa/main/attrib.c
@@ -1395,24 +1395,31 @@ _mesa_PushClientAttrib(GLbitfield mask)
       struct gl_array_attrib *attr;
       struct gl_array_object *obj;
 
-      attr = MALLOC_STRUCT( gl_array_attrib );
-      obj = MALLOC_STRUCT( gl_array_object );
-
-#if FEATURE_ARB_vertex_buffer_object
-      /* increment ref counts since we're copying pointers to these objects */
-      ctx->Array.ArrayBufferObj->RefCount++;
-      ctx->Array.ElementArrayBufferObj->RefCount++;
-#endif
-
-      memcpy( attr, &ctx->Array, sizeof(struct gl_array_attrib) );
-      memcpy( obj, ctx->Array.ArrayObj, sizeof(struct gl_array_object) );
-
-      attr->ArrayObj = obj;
+      attr = CALLOC_STRUCT( gl_array_attrib );
+      obj = CALLOC_STRUCT( gl_array_object );
+
+      /* Copy gl_array_attrib fields */
+      _mesa_reference_array_object(ctx, &attr->ArrayObj, ctx->Array.ArrayObj);
+      /* skip DefaultArrayObj, Objects */
+      attr->ActiveTexture = ctx->Array.ActiveTexture;
+      attr->LockFirst = ctx->Array.LockFirst;
+      attr->LockCount = ctx->Array.LockCount;
+      attr->PrimitiveRestart = ctx->Array.PrimitiveRestart;
+      /* XXX more fields */
+      _mesa_reference_buffer_object(ctx, &attr->ArrayBufferObj,
+                                    ctx->Array.ArrayBufferObj);
+      _mesa_reference_buffer_object(ctx, &attr->ElementArrayBufferObj,
+                                    ctx->Array.ElementArrayBufferObj);
+
+      /* Copy gl_array_object fields */
+      obj->VBOonly = ctx->Array.ArrayObj->VBOonly;
+      _mesa_copy_client_array(ctx, &obj->Vertex, &ctx->Array.ArrayObj->Vertex);
+      _mesa_copy_client_array(ctx, &obj->Normal, &ctx->Array.ArrayObj->Normal);
+      /* XXX copy more fields */
+
+      _mesa_reference_array_object(ctx, &attr->ArrayObj, obj);
 
       save_attrib_data(&head, GL_CLIENT_VERTEX_ARRAY_BIT, attr);
-
-      /* bump reference counts on buffer objects */
-      adjust_buffer_object_ref_counts(ctx->Array.ArrayObj, 1);
    }
 
    ctx->ClientAttribStack[ctx->ClientAttribStackDepth] = head;
@@ -1462,6 +1469,10 @@ _mesa_PopClientAttrib(void)
 	    struct gl_array_attrib * data =
 	      (struct gl_array_attrib *) node->data;
 
+            /* XXX rewrite this code to call _mesa_reference_array_object(),
+               _mesa_reference_buffer_object(), etc.
+            */
+
             adjust_buffer_object_ref_counts(ctx->Array.ArrayObj, -1);
 	 
             ctx->Array.ActiveTexture = data->ActiveTexture;
