Yep, was using a vec4 for color in the C++ code and was using a vec3 in the shader code.
Oh and I was changing the element buffer object data without a VAO bound. https://www.khronos.org/opengl/wiki/Vertex_Specification says you should not, though it still seems to work just fine everywhere I could test.