diff --git a/src/gpu/shader.cpp b/src/gpu/shader.cpp
index 67d1abdc..0f8c53f3 100644
--- a/src/gpu/shader.cpp
+++ b/src/gpu/shader.cpp
@@ -326,8 +326,13 @@ ShaderAttrib Shader::GetAttribLocation(char const *attr,
     ret.m_flags |= (uint64_t)(uint16_t)index;
 #if defined USE_D3D9 || defined _XBOX
 #elif !defined __CELLOS_LV2__
-    ret.m_flags |= (uint64_t)
-                  (uint32_t)glGetAttribLocation(data->prog_id, attr) << 32;
+    GLint l = glGetAttribLocation(data->prog_id, attr);
+    if (l < 0)
+    {
+        Log::Warn("tried to query invalid attribute: %s\n", attr);
+        l = 0;
+    }
+    ret.m_flags |= (uint64_t)(uint32_t)l << 32;
 #else
     /* FIXME: can we do this at all on the PS3? */
 #endif
diff --git a/src/gpu/vertexbuffer.cpp b/src/gpu/vertexbuffer.cpp
index 9ebdaf56..fa66221a 100644
--- a/src/gpu/vertexbuffer.cpp
+++ b/src/gpu/vertexbuffer.cpp
@@ -374,6 +374,13 @@ void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attr1,
                 if (usage_index++ == index)
                     break;
 
+        if (attr_index == m_count)
+        {
+            Log::Error("stream #%d with usage %x not found in declaration\n",
+                       index, usage);
+            attr_index = 0;
+        }
+
         /* Now compute the stride and offset up to this stream index */
         int stride = 0, offset = 0;
         for (int i = 0; i < m_count; i++)