fix mem leak, add comments
diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c
index 002b427..1831d0f 100644
--- a/src/mesa/shader/shader_api.c
+++ b/src/mesa/shader/shader_api.c
@@ -67,6 +67,10 @@
 }
 
 
+/**
+ * Free the data that hangs off a shader program object, but not the object
+ * itself.
+ */
 void
 _mesa_free_shader_program_data(GLcontext *ctx,
                                struct gl_shader_program *shProg)
@@ -104,11 +108,17 @@
 }
 
 
-
+/**
+ * Free/delete a shader program object.
+ */
 void
 _mesa_free_shader_program(GLcontext *ctx, struct gl_shader_program *shProg)
 {
    _mesa_free_shader_program_data(ctx, shProg);
+   if (shProg->Shaders) {
+      _mesa_free(shProg->Shaders);
+      shProg->Shaders = NULL;
+   }
    _mesa_free(shProg);
 }
 
@@ -431,6 +441,10 @@
          /* found it */
 
          shProg->Shaders[i]->RefCount--;
+         if (shProg->Shaders[i]->RefCount == 0) {
+            /* delete now */
+            _mesa_free_shader(ctx, shProg->Shaders[i]);
+         }
 
          /* alloc new, smaller array */
          newList = (struct gl_shader **)
@@ -446,8 +460,6 @@
             newList[j++] = shProg->Shaders[i];
          _mesa_free(shProg->Shaders);
 
-         /* XXX refcounting! */
-
          shProg->Shaders = newList;
          return;
       }